////////////////////////////////////////////////////////////////////////////////
///                        ClockRealTime.C                                   ///
///                                                                          ///
///       Contents: Firmware for Real Time Clock                             ///
///       Programmer : Truong Van Hieu                                                          ///
///       Date    : 2009/08/10                                               ///
///                                                                          ///
///                                                                          ///
///                                                                          ///
///                                                                          ///
////////////////////////////////////////////////////////////////////////////////

#include <18f4580.h>
#include <Define18F458.h>
#device  *=16 ADC=10 HIGH_INTS=TRUE
#FUSES NOWDT,HS,NODEBUG, NOBROWNOUT, NOLVP
#use delay(clock=20000000)
//#use Fast_IO(b)
#include <DefineClockReadTime.h>
#include <NumberCode.h>
#use i2c(master,sda=device_SDA, scl=device_SCL,slow)
#use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7,errors)
#include <74595Modified.c>
#include <Ds1307.c>
#include <24256.c>
#include <external_eeprom.c>
#include <string.h>

#define NO_PRESS 0
#define BUTTON_A 1
#define BUTTON_B 2
#define BUTTON_C 2

#define RunRealTime 0
#define SettingTime 1

#define StyRealTime 0
#define StySetTimeHour 1
#define StySetTimeMinute 2

#define NumProgramFlash 15  //so chuong trinh flash

//--------------------Khai Bao Hang------------------------------//
const int sl_ad_org = 0;
const int phut_ad_org = 50;
const int giay_ad_org = 100;

const int numberLedDisplay = 4;

//--------------------Khai Bao Bien------------------------------//
int temp=0;
int bamxung;
int flagRandom;
int numProFlash;

int1 sta=0;
int1 flagDisplayTime=0;

int key_press=0;

int mode=0;
int submode=0;

int HourSet;
int MinuteSet;



int1 flagSetTime=0;
int1 general=0;
int1 back_all=0;
int1 back1=0;
int1 count_enable=1;



int number=0;
int gio, phut, giay;
int scount=0;
int mcount=0;
int slan;
int pt,st,loop;
int bt=0;

int order[20];
int M_array[20];
int S_array[20];
int test = 0;
char *strDisp[]="    PHUOC LOC THO      ";
//char *strDisp[]="    SINH NHAT HA KHUE    ";

//--------------------Khai Bao Ham -------------------======-----------//
void init();
void bip(int lan);
int getKeyHit();
void nextMode();
void readKey();
void changeHour();
void changeMinute();
void turn_off_led();
void turn_on_led();
void display( int v1, int v2, int v3, int style );
void init_data();
void set_data( int &loopset, int &ptset, int &stset, int submode );
void flash_1();
void flash_2();
void flash_3();
void flash_4();
void flash_5();//chua viet
void flash_6();//chua viet
void flash_7();//chua viet
void flash_8();//chua viet
void flash_9();//chua viet
void flash_10();//chua viet

void flash_main(int i);
void dis_time();
void run_system();
long rand1(int RAND_MAX1, unsigned int32 _Randseed1);
int ReadChar( char *str, int i );
void disString(char *strDisp);
//-----------End Khai Bao Ham------------------------------------------//

//----Ngat time0------------------------------------------------------//
#INT_RTCC
TIMER0_isr()
{
   flagDisplayTime = 1;
   if (count_enable)
   {
      number++;
      scount++;
      if (scount>=60)
      {
         scount=0;
         mcount++;
         if (mcount>=60) {mcount=0;}
      }
   }

   flagSetTime = !flagSetTime;
   set_RTCC(0xff);
}

//----Ngat ngoai---------------------------------------------------//

#INT_EXT HIGH
void ext_isr()
{
   key_press = 0;//reset

   if (input(key1))
   {
      key_press = BUTTON_A;
   }
   else
   {
      if (input(key2))
      {
         key_press = BUTTON_B;
      }
      else
      {
         key_press = NO_PRESS;
      }
   }
}

//-----------------------------------------------------------------//
//                                                                 //
//                      KHAI BAO CHUONG TRINH CON                  //
//                                                                 //
//-----------------------------------------------------------------//
void init()
{
   set_tris_b(0xff);
   set_tris_d(0x00);
   trisC0=0;
   trisc1=0;
   trisc2=0;
   trisc5=0;
   COI(0);
   //trisa4=1;
   //set_timer0(255);
   set_RTCC(255);
   setup_timer_0 (RTCC_EXT_H_TO_L|RTCC_8_bit|RTCC_DIV_1);
   enable_interrupts(INT_RTCC);
   //enable_interrupts(INT_EXT);
   //EXT_INT_EDGE(L_TO_H);
   loa(1);
   WP(1);
   bamxung = 0;
}

//----Tao am thanh-------------------------------------------------------//
void bip(int lan)
{
   int i;
   for (i=0; i<lan; i++)
   {
      loa(0);
      COI(1);
      delay_ms(80);
      loa(1);
      COI(0);
      delay_ms(80);
   }
}

//----Nhan phim---------------------------------------------------------//
int getKeyHit()
{
      return   key_press;
}

//----Change mode---------------------------------------------------------//
void nextMode()
{
      switch( mode )
      {
         case RunRealTime:
               {
                  mode = SettingTime;
                  submode = 0;
               }
               break;

         case SettingTime:
               {
                  switch( submode )
                  {
                     case 0:
                     case 1:
                           {
                              submode ++;
                              if( submode > 1)
                              {
                                 mode = RunRealTime;
                                 submode = 0;
                                 ds1307_set_time( gio, phut, 0);
                                 bip(4);
                              }
                           }
                           break;
                  }
               }
               break;
      }
}

//----Read key---------------------------------------------------------//
void readKey()
{
   //--------------------------------------
   key_press = 0;//reset

   if (!input(key1))
   {
      delay_ms(15);
      if (!input(key1))
      {
         key_press = BUTTON_A;
         bip(1);
      }
   }
   else
   {
      if (!input(key2))
      {
         delay_ms(20);
         if (!input(key2))
         {
            key_press = BUTTON_B;
            bip(1);
         }
      }
      else
      {
         if (!input(key3))
         {
            delay_ms(10);
            if (!input(key3))
            {
               key_press = BUTTON_C;
               bip(1);
            }
         }
         else
         {
            key_press = NO_PRESS;
         }
      }
   }

   //--------------------------------------

   if( getKeyHit() == BUTTON_A )
   {
      nextMode();
   }

}


//----Random==---------------------------------------------------------//
long rand1(int RAND_MAX1, unsigned int32 _Randseed1)
{
   _Randseed1 = _Randseed1 * 1103515245 + 12345;
   return ((unsigned long)(_Randseed1 >> 16) % RAND_MAX1);
}

//----Tat led----------------------------------------------------------//
void turn_off_led()
{
   int buf[numberLedDisplay];
   int i;
   for (i=0; i<numberLedDisplay; i++)
   {
      buf[i] = NC[10];
   }
   write_expanded_outputs(buf);
}

//----Bat led----------------------------------------------------------//
void turn_on_led()
{
   int buf[numberLedDisplay];
   int i;
   for (i=0; i<numberLedDisplay; i++)
   {
      buf[i] = NC[11];
   }
   write_expanded_outputs(buf);
}

//----Hien thi--------------------------------------------------------//
int ReadChar( char *str, int i )
{
   char * temp;
   int str_no;
   
   temp = str;
   str_no = 0;
	while( str_no < i )
   {
		temp ++;
      str_no++;
   }

   if( ( *temp >= 'a' ) && ( *temp <= 'z' ) ) {
      return (int)( *temp - 'a' );
   }
   else if( ( *temp >= 'A' ) && ( *temp <= 'Z' ) ) {
      return ((int)( *temp - 'A' )+26);
   }
   else if( *temp == ' ' ) {
      return font_off;
   }
   else
   {
      return  0;
   }

}
//----Hien thi--------------------------------------------------------//
void display( int v1, int v2, int v3, int style )
{
   int buf[4];
   int chuc1, dv1, chuc2, dv2;

   chuc1 = v1/10;
   dv1 = v1%10;

   chuc2 = v2/10;
   dv2 = v2%10;
   //--------------------------
   switch( style )
   {
      case 0:
         {
            buf[0]=NC[chuc1]; buf[1]=NC[dv1];
            buf[2]=NC[chuc2]; buf[3]=NC[dv2];

            if( v3 % 2 == 0 )
            {
               buf[3] = (buf[3] | 0b00000001);
            }
         }
         break;

      case 1://set hour
         {
            if (flagSetTime)
            {
               buf[0]=NC[chuc1]; buf[1]=NC[dv1];
            }
            else
            {
               buf[0]=NC[10]; buf[1]=NC[10];//tat
            }
            buf[2]=NC[chuc2]; buf[3]=NC[dv2];

            if( v3 % 2 == 0 )
            {
               buf[3] = (buf[3] | 0b00000001);
            }
         }
         break;

      case 2://set minute
         {
            if (flagSetTime)
            {
               buf[2]=NC[chuc2]; buf[3]=NC[dv2];
            }
            else
            {
               buf[2]=NC[10]; buf[3]=NC[10];
            }
            buf[0]=NC[chuc1]; buf[1]=NC[dv1];

            if( v3 % 2 == 0 )
            {
               buf[3] = (buf[3] | 0b00000001);
            }
         }
         break;



      default:
         {
            buf[0]=NC[chuc1]; buf[1]=NC[dv1];
            buf[2]=NC[chuc2]; buf[3]=NC[dv2];
         }
         break;
   }

   write_expanded_outputs(buf);
}


//----Flash display------------------------------------------------------//
void flash( int v1, int v2, int v3, int v4, int style )
{
   int buf[4];

   //--------------------------
   switch( style )
   {
      case 0:
         {
            turn_off_led();
         }
         break;

     case 1://mode hai hang o tren cho chay
         {
            switch( v1 )
            {
               case 0://tat het
                  {
                     turn_off_led();
                  }
                  break;

               case 1:
                  {
                     buf[0]=NC[12]; buf[1]=NC[10]; buf[2]=NC[10]; buf[3]=NC[10];
                  }
                  break;
               case 2:
                  {
                     buf[0]=NC[10]; buf[1]=NC[12]; buf[2]=NC[10]; buf[3]=NC[10];
                  }
                  break;
               case 3:
                  {
                     buf[0]=NC[10]; buf[1]=NC[10]; buf[2]=NC[12]; buf[3]=NC[10];
                  }
                  break;
               case 4:
                  {
                     buf[0]=NC[10]; buf[1]=NC[10]; buf[2]=NC[10]; buf[3]=NC[12];
                  }
                  break;
            }
         }
         break;

      case 2://mot thanh doc chay o giua
         {
            switch( v1 )
            {
               case 0://tat het
                  {
                     turn_off_led();
                  }
                  break;

               case 1:
                  {
                     buf[0]=NC[13]; buf[1]=NC[10]; buf[2]=NC[10]; buf[3]=NC[10];
                  }
                  break;
               case 2:
                  {
                     buf[0]=NC[14]; buf[1]=NC[10]; buf[2]=NC[10]; buf[3]=NC[10];
                  }
                  break;
               case 3:
                  {
                     buf[0]=NC[10]; buf[1]=NC[13]; buf[2]=NC[10]; buf[3]=NC[10];
                  }
                  break;
               case 4:
                  {
                     buf[0]=NC[10]; buf[1]=NC[14]; buf[2]=NC[10]; buf[3]=NC[10];
                  }
                  break;
               case 5:
                  {
                     buf[0]=NC[10]; buf[1]=NC[10]; buf[2]=NC[13]; buf[3]=NC[10];
                  }
                  break;
               case 6:
                  {
                     buf[0]=NC[10]; buf[1]=NC[10]; buf[2]=NC[14]; buf[3]=NC[10];
                  }
                  break;
               case 7:
                  {
                     buf[0]=NC[10]; buf[1]=NC[10]; buf[2]=NC[10]; buf[3]=NC[13];
                  }
                  break;
               case 8:
                  {
                     buf[0]=NC[10]; buf[1]=NC[10]; buf[2]=NC[10]; buf[3]=NC[14];
                  }
                  break;
            }
         }
         break;

      case 3://sang vong tron lon roi nhap nhay
         {
            switch( v1 )
            {
               case 0://tat het
                  {
                     turn_off_led();
                  }
                  break;
               case 1:
                  {
                     buf[0]=(NC[10] | NC[15] | NC[18] | NC[19] | NC[20]);
                     buf[1]=(NC[10] | NC[15] | NC[18]);
                     buf[2]=(NC[10] | NC[15] | NC[18]);
                     buf[3]=(NC[10] | NC[15] | NC[16] | NC[17] | NC[18]);
                  }
                  break;
            }
         }
         break;

     case 4://mode ba chay qua phai
         {
            switch( v1 )
            {
               case 0://tat het
                  {
                     turn_off_led();
                  }
                  break;

               case 1:
                  {
                     buf[0]= (NC[12] | NC[21]) ; buf[1]=NC[10]; buf[2]=NC[10]; buf[3]=NC[10];
                  }
                  break;
               case 2:
                  {
                     buf[0]=NC[10]; buf[1]=(NC[12] | NC[21]); buf[2]=NC[10]; buf[3]=NC[10];
                  }
                  break;
               case 3:
                  {
                     buf[0]=NC[10]; buf[1]=NC[10]; buf[2]=(NC[12] | NC[21]); buf[3]=NC[10];
                  }
                  break;
               case 4:
                  {
                     buf[0]=NC[10]; buf[1]=NC[10]; buf[2]=NC[10]; buf[3]=(NC[12] | NC[21]);
                  }
                  break;
            }
         }
         break;

     case 5://mode hang tren chay qua phai, hang duoi chay qua phai
         {
            switch( v1 )
            {
               case 0://tat het
                  {
                     turn_off_led();
                  }
                  break;

               case 1:
                  {
                     buf[0]=NC[15]; buf[1]=NC[10]; buf[2]=NC[10]; buf[3]=(NC[10] | NC[18] );
                  }
                  break;
               case 2:
                  {
                     buf[0]=NC[10]; buf[1]=NC[15]; buf[2]=(NC[10] | NC[18] ); buf[3]=NC[10];
                  }
                  break;
               case 3:
                  {
                     buf[0]=NC[10]; buf[1]=(NC[10] | NC[18] ); buf[2]=NC[15]; buf[3]=NC[10];
                  }
                  break;
               case 4:
                  {
                     buf[0]=(NC[10] | NC[18] ); buf[1]=NC[10]; buf[2]=NC[10]; buf[3]=NC[15];
                  }
                  break;
            }
         }
         break;

      case 6://mot thanh chay quanh vong tron lon
         {
            switch( v1 )
            {
               case 1:
                  {
                     buf[0]=(NC[10] | NC[15] | NC[18] | NC[19] | NC[20]);
                     buf[1]=(NC[10] | NC[15] | NC[18]);
                     buf[2]=(NC[10] | NC[15] | NC[18]);
                     buf[3]=(NC[10] | NC[15] | NC[16] | NC[17] | NC[18]);
                  }
                  break;
               case 2:
                  {
                     buf[0]=(NC[10] | NC[18] | NC[19] | NC[20]);
                     buf[1]=(NC[10] | NC[15] | NC[18]);
                     buf[2]=(NC[10] | NC[15] | NC[18]);
                     buf[3]=(NC[10] | NC[15] | NC[16] | NC[17] | NC[18]);
                  }
                  break;
               case 3:
                  {
                     buf[0]=(NC[10] | NC[18] | NC[19] | NC[20]);
                     buf[1]=(NC[10] | NC[18]);
                     buf[2]=(NC[10] | NC[15] | NC[18]);
                     buf[3]=(NC[10] | NC[15] | NC[16] | NC[17] | NC[18]);
                  }
                  break;
               case 4:
                  {
                     buf[0]=(NC[10] | NC[18] | NC[19] | NC[20]);
                     buf[1]=(NC[10] | NC[18]);
                     buf[2]=(NC[10] | NC[18]);
                     buf[3]=(NC[10] | NC[15] | NC[16] | NC[17] | NC[18]);
                  }
                  break;
               case 5:
                  {
                     buf[0]=(NC[10] | NC[18] | NC[19] | NC[20]);
                     buf[1]=(NC[10] | NC[18]);
                     buf[2]=(NC[10] | NC[18]);
                     buf[3]=(NC[10] | NC[16] | NC[17] | NC[18]);
                  }
                  break;
               case 6:
                  {
                     buf[0]=(NC[10] | NC[18] | NC[19] | NC[20]);
                     buf[1]=(NC[10] | NC[18]);
                     buf[2]=(NC[10] | NC[18]);
                     buf[3]=(NC[10] | NC[17] | NC[18]);
                  }
                  break;
               case 7:
                  {
                     buf[0]=(NC[10] | NC[18] | NC[19] | NC[20]);
                     buf[1]=(NC[10] | NC[18]);
                     buf[2]=(NC[10] | NC[18]);
                     buf[3]=(NC[10] | NC[18]);
                  }
                  break;
               case 8:
                  {
                     buf[0]=(NC[10] | NC[18] | NC[19] | NC[20]);
                     buf[1]=(NC[10] | NC[18]);
                     buf[2]=(NC[10] | NC[18]);
                     buf[3]=(NC[10]);
                  }
                  break;
               case 9:
                  {
                     buf[0]=(NC[10] | NC[18] | NC[19] | NC[20]);
                     buf[1]=(NC[10] | NC[18]);
                     buf[2]=(NC[10]);
                     buf[3]=(NC[10]);
                  }
                  break;
               case 10:
                  {
                     buf[0]=(NC[10] | NC[18] | NC[19] | NC[20]);
                     buf[1]=(NC[10]);
                     buf[2]=(NC[10]);
                     buf[3]=(NC[10]);
                  }
                  break;
               case 11:
                  {
                     buf[0]=(NC[10] | NC[19] | NC[20]);
                     buf[1]=(NC[10]);
                     buf[2]=(NC[10]);
                     buf[3]=(NC[10]);
                  }
                  break;
               case 12:
                  {
                     buf[0]=(NC[10] | NC[20]);
                     buf[1]=(NC[10]);
                     buf[2]=(NC[10]);
                     buf[3]=(NC[10]);
                  }
                  break;
               case 13:
                  {
                     buf[0]=(NC[10]);
                     buf[1]=(NC[10]);
                     buf[2]=(NC[10]);
                     buf[3]=(NC[10]);
                  }
                  break;
            }
         }
         break;
      case 7://vong tron lon chay xung quanh
         {
            switch( v1 )
            {
               case 1:
                  {
                     buf[0]=(NC[10] | NC[15] | NC[19] );
                     buf[1]=(NC[10] | NC[18]);
                     buf[2]=(NC[10] | NC[15] );
                     buf[3]=(NC[10] | NC[16] | NC[18]);
                  }
                  break;
               case 2:
                  {
                     buf[0]=(NC[10] | NC[18] | NC[20]);
                     buf[1]=(NC[10] | NC[15] );
                     buf[2]=(NC[10] | NC[18]);
                     buf[3]=(NC[10] | NC[15] | NC[17] );
                  }
                  break;
            }
         }
         break;
      case 8://thanh dung di chuyen qua phai
         {
            switch( v1 )
            {
               case 1:
                  {
                     buf[0]=(NC[19] | NC[20] );
                     buf[1]=(NC[19] | NC[20] );
                     buf[2]=(NC[19] | NC[20] );
                     buf[3]=(NC[19] | NC[20] );
                  }
                  break;
               case 2:
                  {
                     buf[0]=(NC[16] | NC[17] );
                     buf[1]=(NC[16] | NC[17] );
                     buf[2]=(NC[16] | NC[17] );
                     buf[3]=(NC[16] | NC[17] );
                  }
                  break;
            }
         }
         break;
      case 9://mot hang chay tu tren xuong duoi
         {
            switch( v1 )
            {
               case 1:
                  {
                     buf[0]=(NC[15]);
                     buf[1]=(NC[15]);
                     buf[2]=(NC[15]);
                     buf[3]=(NC[15] );
                  }
                  break;
               case 2:
                  {
                     buf[0]=(NC[21]);
                     buf[1]=(NC[21]);
                     buf[2]=(NC[21]);
                     buf[3]=(NC[21]);
                  }
                  break;
               case 3:
                  {
                     buf[0]=(NC[18] );
                     buf[1]=(NC[18] );
                     buf[2]=(NC[18] );
                     buf[3]=(NC[18] );
                  }
                  break;
            }
         }
         break;
      case 10://hai bong hoa xoay tron
         {
            switch( v1 )
            {
               case 1:
                  {
                     buf[0]=(NC[16]|NC[17]);
                     buf[1]=(NC[19]|NC[20]);
                     buf[2]=(NC[16]|NC[17]);
                     buf[3]=(NC[19]|NC[20] | 0b00000001);
                  }
                  break;
               case 2:
                  {
                     buf[0]=(NC[21]);
                     buf[1]=(NC[21]);
                     buf[2]=(NC[21]);
                     buf[3]=(NC[21] | 0b00000001);
                  }
                  break;
            }
         }
         break;
      case 11://hai bong hoa xoay tron nhu canh quat
         {
            switch( v1 )
            {
               case 1:
                  {
                     buf[0]=(NC[21]);
                     buf[1]=(NC[10]);
                     buf[2]=(NC[21]);
                     buf[3]=(NC[10] | 0b00000000);
                  }
                  break;
               case 2:
                  {
                     buf[0]=(NC[16]);
                     buf[1]=(NC[20]);
                     buf[2]=(NC[16]);
                     buf[3]=(NC[20] | 0b00000001);
                  }
                  break;
               case 3:
                  {
                     buf[0]=(NC[10]);
                     buf[1]=(NC[21]);
                     buf[2]=(NC[10]);
                     buf[3]=(NC[21] | 0b00000000);
                  }
                  break;
               case 4:
                  {
                     buf[0]=(NC[17]);
                     buf[1]=(NC[19]);
                     buf[2]=(NC[17]);
                     buf[3]=(NC[19] | 0b00000001);
                  }
                  break;
            }
         }
         break;
      case 12://mot hang chay tu tren xuong duoi
         {
            switch( v1 )
            {
               case 1:
                  {
                     buf[0]=(NC[20] | NC[17] );
                     buf[1]=(NC[20] | NC[17] );
                     buf[2]=(NC[20] | NC[17] );
                     buf[3]=(NC[20] | NC[17] );
                  }
                  break;
               case 2:
                  {
                     buf[0]=(NC[16] | NC[19] );
                     buf[1]=(NC[16] | NC[19] );
                     buf[2]=(NC[16] | NC[19] );
                     buf[3]=(NC[16] | NC[19] );
                  }
                  break;
            }
         }
         break;
      case 13://mot hang chay tu tren xuong duoi,mot hang chay tu duoi len tren
         {
            switch( v1 )
            {
               case 1:
                  {
                     buf[0]=(NC[15]);
                     buf[1]=(NC[18]);
                     buf[2]=(NC[15]);
                     buf[3]=(NC[18] );
                  }
                  break;
               case 2:
                  {
                     buf[0]=(NC[21]);
                     buf[1]=(NC[21]);
                     buf[2]=(NC[21]);
                     buf[3]=(NC[21]);
                  }
                  break;
               case 3:
                  {
                     buf[0]=(NC[18] );
                     buf[1]=(NC[15] );
                     buf[2]=(NC[18] );
                     buf[3]=(NC[15] );
                  }
                  break;
            }
         }
         break;
      case 14://mot thanh sang chay quanh vong tron lon
         {
            switch( v1 )
            {
               case 1:
                  {
                     buf[0]=NC[15];
                     buf[1]=NC[10];
                     buf[2]=NC[10];
                     buf[3]=NC[10]|0b00000001;
                  }
                  break;
               case 2:
                  {
                     buf[0]=NC[10];
                     buf[1]=NC[15];
                     buf[2]=NC[10];
                     buf[3]=NC[10];
                  }
                  break;
               case 3:
                  {
                     buf[0]=NC[10];
                     buf[1]=NC[10];
                     buf[2]=NC[15];
                     buf[3]=NC[10]|0b00000001;
                  }
                  break;
               case 4:
                  {
                     buf[0]=NC[10];
                     buf[1]=NC[10];
                     buf[2]=NC[10];
                     buf[3]=NC[15];
                  }
                  break;
               case 5:
                  {
                     buf[0]=NC[10];
                     buf[1]=NC[10];
                     buf[2]=NC[10];
                     buf[3]=NC[16]|0b00000001;
                  }
                  break;
               case 6:
                  {
                     buf[0]=NC[10];
                     buf[1]=NC[10];
                     buf[2]=NC[10];
                     buf[3]=NC[17];
                  }
                  break;
               case 7:
                  {
                     buf[0]=NC[10];
                     buf[1]=NC[10];
                     buf[2]=NC[10];
                     buf[3]=NC[18]|0b00000001;
                  }
                  break;
               case 8:
                  {
                     buf[0]=NC[10];
                     buf[1]=NC[10];
                     buf[2]=NC[10];
                     buf[3]=NC[18];
                  }
                  break;
               case 9:
                  {
                     buf[0]=NC[10];
                     buf[1]=NC[10];
                     buf[2]=NC[18];
                     buf[3]=NC[10]|0b00000001;
                  }
                  break;
               case 10:
                  {
                     buf[0]=NC[10];
                     buf[1]=NC[18];
                     buf[2]=NC[10];
                     buf[3]=NC[10];
                  }
                  break;
               case 11:
                  {
                     buf[0]=NC[18];
                     buf[1]=NC[10];
                     buf[2]=NC[10];
                     buf[3]=NC[10]|0b00000001;
                  }
                  break;
               case 12:
                  {
                     buf[0]=NC[19];
                     buf[1]=NC[10];
                     buf[2]=NC[10];
                     buf[3]=NC[10];
                  }
                  break;
               case 13:
                  {
                     buf[0]=NC[20];
                     buf[1]=NC[10];
                     buf[2]=NC[10];
                     buf[3]=NC[10]|0b00000001;
                  }
                  break;
            }
         }
         break;
      case 15://mot thanh sang chay quanh vong tron nho
         {
            switch( v1 )
            {
               case 1:
                  {
                     buf[0]=NC[15];
                     buf[1]=NC[10];
                     buf[2]=NC[10];
                     buf[3]=NC[15]|0b00000001;
                  }
                  break;
               case 2:
                  {
                     buf[0]=NC[10];
                     buf[1]=NC[15];
                     buf[2]=NC[15];
                     buf[3]=NC[10];
                  }
                  break;
               case 3:
                  {
                     buf[0]=NC[10];
                     buf[1]=NC[16];
                     buf[2]=NC[20];
                     buf[3]=NC[10]|0b00000001;
                  }
                  break;
               case 4:
                  {
                     buf[0]=NC[10];
                     buf[1]=NC[17];
                     buf[2]=NC[19];
                     buf[3]=NC[10];
                  }
                  break;
               case 5:
                  {
                     buf[0]=NC[10];
                     buf[1]=NC[18];
                     buf[2]=NC[18];
                     buf[3]=NC[10];
                  }
                  break;
               case 6:
                  {
                     buf[0]=NC[18];
                     buf[1]=NC[10];
                     buf[2]=NC[10];
                     buf[3]=NC[18]|0b00000001;
                  }
                  break;
               case 7:
                  {
                     buf[0]=NC[19];
                     buf[1]=NC[10];
                     buf[2]=NC[10];
                     buf[3]=NC[17];
                  }
                  break;
               case 8:
                  {
                     buf[0]=NC[20];
                     buf[1]=NC[10];
                     buf[2]=NC[10];
                     buf[3]=NC[16]|0b00000001;
                  }
                  break;
            }
         }
         break;
      default:
         {
            buf[0]=NC[10]; buf[1]=NC[10]; buf[2]=NC[10]; buf[3]=NC[10];
         }
         break;
   }

   write_expanded_outputs(buf);
}

//----Init----------------------------------------------------------------//
void init_data()
{
   int i;
   for (i=0;i<20;i++)
   {
      order[i]=2;
      M_array[i]=1;
      S_array[i]=i;
   }
}

//----Hien thi chu----------------------------------------------------------------//
void disString(char *strDisp)
{
   int i;
   int buf[4];
   
   for(i=0; i<= (strlen(strDisp)-4); i++)
   {   
      buf[0]=Font[ReadChar(strDisp, i)]; buf[1]=Font[ReadChar(strDisp, i+1)];
      buf[2]=Font[ReadChar(strDisp, i+2)]; buf[3]=Font[ReadChar(strDisp, i+3)];
   
      write_expanded_outputs(buf);
      delay_ms(270);
   }         
}


//----Flash 1------------------------------------------------------------//
void flash_1()
{
  int i;
   for(i=1; i<=4 ; i++)
   {
      flash( i, 0, 0, 0, 11 );
      delay_ms(170);
   }
}

//----Flash 2------------------------------------------------------------//
void flash_2()
{
   int i;
   for(i=1; i<=8 ; i++)
   {
      flash( i, 0, 0, 0, 15 );
      delay_ms(60);
   }
}

//----Flash 3---Sang mot vong tron lon-----------------------------------//
void flash_3()
{
   int i;
   flash( 1, 0, 0, 0, 3 );
   delay_ms(100);
   turn_off_led();
   delay_ms(100);
}

//----Flash 4------------------------------------------------------------//
void flash_4()
{
   int i;
   for(i=1; i<=4 ; i++)
   {
      flash( i, 0, 0, 0, 4 );
      delay_ms(300);
   }
}

//----Flash 5-thanh ngang tren chay qua trai, thanh ngang duoi chay qua giua-//
void flash_5()
{
   int i;
   for(i=1; i<=3 ; i++)
   {
      flash( i, 0, 0, 0, 13 );
      delay_ms(250);
   }
}

//----Flash 6------------------------------------------------------------//
void flash_6()
{
   int i;
   flash( 1, 0, 0, 0, 6 );
   delay_ms(600);
   for(i=2; i<=13 ; i++)
   {
      flash( i, 0, 0, 0, 6 );
      delay_ms(100);
   }
}


//----Flash 7------------------------------------------------------------//
void flash_7()
{
   int i;
   for(i=1; i<=2 ; i++)
   {
      flash( i, 0, 0, 0, 7 );
      delay_ms(170);
   }
}

//----Flash 8------------------------------------------------------------//
void flash_8()
{
   int i;
   for(i=1; i<=2 ; i++)
   {
      flash( i, 0, 0, 0, 8 );
      delay_ms(170);
   }
}

//----Flash 9------------------------------------------------------------//
void flash_9()
{
   int i;
   for(i=1; i<=3 ; i++)
   {
      flash( i, 0, 0, 0, 9 );
      delay_ms(200);
   }
}

//----Flash 10------------------------------------------------------------//
void flash_10()
{
   int i;
   for(i=1; i<=2 ; i++)
   {
      flash( i, 0, 0, 0, 10 );
      delay_ms(200);
   }
}

//----Flash 11------------------------------------------------------------//
void flash_11()
{
   int i;
   for(i=1; i<=4 ; i++)
   {
      flash( i, 0, 0, 0, 1 );
      delay_ms(300);
   }
}

//----Flash 12------------------------------------------------------------//
void flash_12()
{
   int i;
   for(i=1; i<=2 ; i++)
   {
      flash( i, 0, 0, 0, 12 );
      delay_ms(200);
   }
}

//----Flash 13------------------------------------------------------------//
void flash_13()
{
   int i;
   for(i=1; i<=4 ; i++)
   {
      flash( i, 0, 0, 0, 5 );
      delay_ms(300);
   }
}

//----Flash 14------------------------------------------------------------//
void flash_14()
{
   int i;
   for(i=1; i<=13 ; i++)
   {
      flash( i, 0, 0, 0, 14 );
      delay_ms(80);
   }
}

//----Flash 15------------------------------------------------------------//
void flash_15()
{
   int i;
   for(i=1; i<=8 ; i++)
   {
      flash( i, 0, 0, 0, 2 );
      delay_ms(100);
   }
   //delay_ms(100);
   for(i=8; i>=1 ; i--)
   {
      flash( i, 0, 0, 0, 2 );
      delay_ms(100);
   }
}
//----Flash Main--------------------------------------------------------//
void flash_main(int i)
{
   switch( i )
   {
      case 1:
         {
            flash_1();
         }
         break;

      case 2:
         {
            flash_2();
         }
         break;

      case 3:
         {
            flash_3();
         }
         break;
      case 4:
         {
            flash_4();
         }
         break;
      case 5:
         {
            flash_5();
        }
         break;
      case 6:
         {
            flash_6();
         }
         break;
      case 7:
         {
            flash_7();
         }
         break;
      case 8:
         {
            flash_8();
         }
         break;
      case 9:
         {
            flash_9();
         }
         break;
      case 10:
         {
            flash_10();
         }
         break;
      case 11:
         {
            flash_11();
         }
         break;
      default:
         {
            flash_11();
         }
         break;
   }
}


//----Set data---------------------------------------------------------//
void set_data( int &loopset, int &ptset, int &stset, int submode )
{
   general = 1;

   while ( mode == SettingTime )
   {
      switch( submode )
      {
         //chinh gio
         case 0:
               {
                  if( getKeyHit() == BUTTON_B )//tang gio
                  {
                     loopset++;
                     if( loopset > 23) loopset=0;
                  }
                  else
                  {
                     display( loopset, ptset, stset, StySetTimeHour );
                  }
               }
               break;
         //chinh phut
         case 1:
               {
                  if( getKeyHit() == BUTTON_B )//tang phut
                  {
                     ptset++;
                     if( ptset > 59) ptset = 0;
                  }
                  else
                  {
                     display( loopset, ptset, stset, StySetTimeMinute );
                  }
               }
               break;
      }
   }
   /*
   //save time-------------------------------
   if (gio<24 && phut<60 && giay<60 )
   {
      ds1307_set_time( gio, phut, giay);
      bip(3);
   }
   */
   general=0;
}

//----Display time----------------------------------------------------//
void dis_time()
{
   bamxung++;
   if(bamxung > 100000)
   {
      bamxung = 0;
   }
   //get time--------------------------------------------------------
   if( flagDisplayTime )
   {
      ds1307_get_time( gio, phut, giay );
      flagDisplayTime = 0;

      if( (phut == 0) && (giay == 0) )
      {
         display( gio, phut, giay, StyRealTime );
         bip( gio );
      }
   }


   //Tao hieu ung---------------------------------------------------
   //if( (phut % 57 == 0) && giay < 20)
   //if( (phut % 2 == 1)&&(giay > 10) && (giay < 16))
   if( (giay > 10) && (giay < 16))
   {
      if(flagRandom)
      {
         numProFlash = rand1(NumProgramFlash, phut) + 1;
         flagRandom = 0;
         //bip(1);
      }
      
      if(phut % 10 == 0 )
      {
         disString(strDisp);
      }
      else
      {
         flash_main(numProFlash);
      }
   }
   else//hien thi gio----------------------------------------------
   {
      flagRandom = 1;
      if(bamxung % 6 == 0)
      {
         display( gio, phut, giay, StyRealTime );
      }
      else
      {
         turn_off_led();
      }
   }

}

//----Run RTC-- --------------------------------------------------//
void run_RTC()
{
	dis_time();
}

//----Run System-- ---------------------------------------------//
void run_system()
{
	while (1)
	{
      //---test cac ham-------------------------------
      if(test)
      {
         int i;
         /*
         //check loa------------------------
         bip(1);
         turn_on_led();
         delay_ms(1000);

         bip(1);
         turn_off_led();
         delay_ms(1000);
         */
         /*
         output_bit( PIN_c0, 0 );
         output_bit( PIN_c1, 1 );
         output_bit( PIN_c2, 0 );
         delay_ms(2000);
         output_bit( PIN_c0, 1 );
         output_bit( PIN_c1, 0 );
         output_bit( PIN_c2, 1 );
         delay_ms(2000);
         */
         //dis_time();

         //check hien thi------------------------
         //int i, giay11, phut11, gio11;
         //giay11 = 0; phut11 = 1; gio11 =  0;
         //display( 1, 1, 1, 3 );
         /*
         for(i=0; i <= 59; i++)
         {
            giay11 = i;
            gio11 = i;
            phut11 = i;
            display( gio11, phut11, giay11, 0 );
            //bip(1);
            delay_ms(1000);
         }

         */
         /*
         //check loa------------------------
         ds1307_get_time( gio, phut, giay );
         display( gio, phut, giay, 0 );
         if(gio == 15)
         {
            bip(1);
         }
         bip(1);
         */

         //check button---------------------
         if (!input(key1))
         {
            bip(1);
         }
         if (!input(key2))
         {
            bip(2);
            turn_on_led();
         }

         if (!input(key3))
         {
            bip(3);
            turn_off_led();
         }
         
         disString(strDisp);
         continue;
      }
      //end check --------------------------------

      //---read key--------------------------------------------------
      readKey();

      //---process---------------------------------------------------
		switch ( mode )
		{
         //chay thoi gian thuc------------------------
			case RunRealTime:
               {
                  dis_time();
               }
               break;
         //hieu chinh thoi gian----------------------
			case SettingTime:
               {
                  switch( submode )
                  {
                     //chinh gio----------------
                     case 0:
                           {
                              //display( 11, 11, 22, StySetTimeHour );
                              if( getKeyHit() == BUTTON_B )//tang gio
                              {
                                 gio++;
                                 bip(1);
                                 if( gio > 23) { gio = 0; };
                              }
                              else
                              {
                                 display( gio, phut, 0, StySetTimeHour );
                              }
                           }
                     break;
                     case 1:
                           {
                              //display( 22, 22, 22, StySetTimeMinute );
                              if( getKeyHit() == BUTTON_B )//tang phut
                              {
                                 phut++;
                                 if( phut > 59) { phut = 0; }
                              }
                              else
                              {
                                 display( gio, phut, 0, StySetTimeMinute );
                              }
                           }
                           break;
                  }
               }
               break;
         //------------------------------------------
		}
	}
}


//-----------------------------------------------------------------//
//                                                                 //
//                      CHUONG TRINH CHINH                         //
//                                                                 //
//-----------------------------------------------------------------//
void main()
{

	init();
	ds1307_init();
	turn_off_led();
	enable_interrupts(GLOBAL);

   ///ds1307_set_time( 15, 14, 0);
	bip(1);
	bip(1);
   delay_ms(1000);

   test = 0;//test
	run_system();
	while (1);
}
//----End -- ---------------------------------------------//
